package cn.itcast.service.impl;

import cn.itcast.dao.cargo.*;
import cn.itcast.domain.cargo.*;
import cn.itcast.domain.vo.ExportProductResult;
import cn.itcast.domain.vo.ExportResult;
import cn.itcast.service.ExportService;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

//报运单业务
@Service
public class ExportServiceImpl implements ExportService {

    @Autowired //合同
    private ContractDao contractDao;

    @Autowired //货物
    private ContractProductDao contractProductDao;

    @Autowired // 附件
    private ExtCproductDao extCproductDao;


    @Autowired //报运单
    private ExportDao exportDao;

    @Autowired //报运单的货物
    private ExportProductDao exportProductDao;

    @Autowired //报运单的附件
    private ExtEproductDao extEproductDao;


    @Override
    public PageInfo findAll(ExportExample example, int page, int size) {
        PageHelper.startPage(page,size);
        List<Export> list = exportDao.selectByExample(example);
        return new PageInfo(list);
    }

    @Override
    public void updateExportAndExportProduct(ExportResult exportResult) {
        // 修改报运单
        String exportId = exportResult.getExportId();
        Export export = exportDao.selectByPrimaryKey(exportId);
        export.setState(exportResult.getState());
        export.setRemark(exportResult.getRemark());
        exportDao.updateByPrimaryKeySelective(export);
        // 修改报运单的货物
        Set<ExportProductResult> products = exportResult.getProducts();
        for (ExportProductResult product : products) {
            ExportProduct exportProduct = exportProductDao.selectByPrimaryKey(product.getExportProductId());
            exportProduct.setTax(product.getTax());
            exportProductDao.updateByPrimaryKeySelective(exportProduct);
        }

    }

    @Override
    public void save(Export export) {
        //1 合同状态变
            //1.1 切割合同id
        String contractIds = export.getContractIds();
        String[] arrIds = contractIds.split(",");
        //1.2 根据合同id拿到对应的合同
        StringBuffer buffer=new StringBuffer();
        for (String contractId : arrIds) {
            Contract contract = contractDao.selectByPrimaryKey(contractId);
            //1.3 修改合同状态到数据库 （state=2）
            contract.setState(2); //已报运
            contractDao.updateByPrimaryKeySelective(contract);
            //1.4 记录合同的合同号 （"ht0001 ht0002"）
            buffer.append(contract.getContractNo()).append(" ");
        }

        //2 报运单变  1条报运单数据
            // 2.1 设置报运单的额外属性（主键 合同号 创建时间 报运单状态）
        export.setId(UUID.randomUUID().toString());
        export.setCustomerContract(buffer.toString());
        export.setCreateTime(new Date());
        export.setState(0); //0:代表刚生成的报运单 草稿状态

        //3 报运单的货物变 4条货物数据
            //3.1 通过合同的id拿到合同的所有货物
        ContractProductExample contractProductExample = new ContractProductExample();
        ContractProductExample.Criteria criteria = contractProductExample.createCriteria();
        List<String> contractIdlist = Arrays.asList(arrIds);
        criteria.andContractIdIn(contractIdlist);
        List<ContractProduct> contractProductList = contractProductDao.selectByExample(contractProductExample);
            //3.2 有一个合同的货物就得有一个报运单的货物
        Map<String, String> map = new HashMap<>();
        for (ContractProduct contractProduct : contractProductList) {
            ExportProduct exportProduct = new ExportProduct();
            //3.3 将合同的货物对象数据给报运单的货物对象
            BeanUtils.copyProperties(contractProduct,exportProduct);
            //3.4 单独将报运单货物的主键设置唯一
            exportProduct.setId(UUID.randomUUID().toString());
            //3.5 单独设置当前循环的报运单货物对象属于指定的报运单
            exportProduct.setExportId(export.getId());
            //3.6 保存报运单的货物对象到报运单的货物表中
            exportProductDao.insertSelective(exportProduct);
            //3.7 将合同的货物id作为key 将报运单的货物id做为值  map<合同货物id,报运单货物id>
            map.put(contractProduct.getId(),exportProduct.getId());
        }

        //4 报运单的附件变 3条附件数据
            //4.1 通过合同的id获取到合同的附件
        ExtCproductExample extCproductExample = new ExtCproductExample();
        ExtCproductExample.Criteria criteria1 = extCproductExample.createCriteria();
        criteria1.andContractIdIn(contractIdlist);
        List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);
            //4.2 有一个合同的附件就得有一个报运单的附件  extCproduct.getContractProduct==合同的货物id
        for (ExtCproduct extCproduct : extCproductList) {
            ExtEproduct extEproduct = new ExtEproduct();
            //4.3 将合同的附件对象数据给报运单的附件对象
            BeanUtils.copyProperties(extCproduct,extEproduct);
            //4.4 单独将报运单附件的主键设置唯一
            extEproduct.setId(UUID.randomUUID().toString());
            //4.5 单独设置当前循环的报运单附件对象属于指定的报运单货物
            extEproduct.setExportProductId(map.get(extCproduct.getContractProductId()));
            //4.6 单独设置当前循环的报运单附件对象属于指定的报运单
            extEproduct.setExportId(export.getId());
            //4.7 保存报运单的附件对象到报运单的附件表中
            extEproductDao.insertSelective(extEproduct);
        }

        //2.2 设置报运单的货物数
        export.setProNum(contractProductList.size());
        //2.3 设置报运单的附件数
        export.setExtNum(extCproductList.size());
        //2.4 保存报运单
        exportDao.insertSelective(export);
    }


    @Override
    public Export findById(String id) {

        return exportDao.selectByPrimaryKey(id);
    }



    @Override
    public void update(Export export) {
        // 修改报运单数据
        exportDao.updateByPrimaryKeySelective(export);;
        // 修改报运单货物数据
        List<ExportProduct> list = export.getExportProducts();
        for (ExportProduct exportProduct : list) {
            exportProductDao.updateByPrimaryKeySelective(exportProduct);
        }
    }

    @Override
    public void delete(String id) {

        // 报运单
        Export export = exportDao.selectByPrimaryKey(id);
        // 报运单货物
        ExportProductExample exportProductExample = new ExportProductExample();
        ExportProductExample.Criteria criteria = exportProductExample.createCriteria();
        criteria.andExportIdEqualTo(id);
        List<ExportProduct> productList = exportProductDao.selectByExample(exportProductExample);
        // 报运单附加
        ExtEproductExample extEproductExample=new ExtEproductExample();
        ExtEproductExample.Criteria criteria1 = extEproductExample.createCriteria();
        criteria1.andExportIdEqualTo(id);
        List<ExtEproduct> extList = extEproductDao.selectByExample(extEproductExample);

        for (ExtEproduct extEproduct : extList) {
            extEproductDao.deleteByPrimaryKey(extEproduct.getId());
        }
        for (ExportProduct exportProduct : productList) {
            exportProductDao.deleteByPrimaryKey(exportProduct.getId());
        }
        exportDao.deleteByPrimaryKey(id);


    }


}
